package com.itheima.leetcode.od.b.priorityqueue;

import java.util.ArrayList;

/**
 * (A卷,100分)- 单词倒序（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 输入单行英文句子，里面包含英文字母，空格以及,.?三种标点符号，请将句子内每个单词进行倒序，并输出倒序后的语句。
 * <p>
 * 输入描述
 * <p>
 * 输入字符串S，S的长度 1 ≤ N ≤ 100
 * <p>
 * 输出描述
 * <p>
 * 输出倒序后的字符串
 * <p>
 * 备注
 * 标点符号左右的空格 ≥ 0，单词间空格＞0
 * <p>
 * 用例
 * <p>
 * 输入	yM eman si boB.
 * 输出	My name is Bob.
 * 说明	无
 * <p>
 * 输入	woh era uoy ? I ma enif.
 * 输出	how are you ? I am fine.
 * 说明	无
 * <p>
 * 题目解析
 * <p>
 * 从用例可以看出，单词的倒序并不难，将字符串单词转为字符数组后，reverse一下就行了。但是单词中如果有标点符号的话，则标点符号的位置不能改变，比如enif. 倒序后为 fine. 其中 . 的位置在倒序前后是一样的。
 * <p>
 * 我的解题思路如下，从左到右遍历每一个字符，如果字符是 , . ? 或者空格，则看成一个分界符，将分界符之间的单词片段进行倒序
 */
public class ReverseOrderOfWords {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();*/

        System.out.println(getResult("yM eman si boB."));
    }

    public static String getResult(String str) {
        ArrayList<Integer> idxs = new ArrayList<>();

        idxs.add(-1);
        for (int i = 0; i < str.length(); i++) {
            if (",.? ".indexOf(str.charAt(i)) != -1) {
                idxs.add(i);
            }
        }
        idxs.add(str.length());

        char[] chars = str.toCharArray();

        // 手动实现 char[] 的 reverse
        for (int i = 0; i < idxs.size() - 1; i++) {
            int l = idxs.get(i) + 1;
            int r = idxs.get(i + 1) - 1;

            while (l < r) {
                char tmp = chars[l];
                chars[l] = chars[r];
                chars[r] = tmp;
                l++;
                r--;
            }
        }

        return new String(chars);
    }
}